package com.qdlc.p2p.biz.service;

import java.util.List;

import com.qdlc.p2p.dal.common.model.jpa.PageDataList;
import com.qdlc.p2p.dal.dto.Borrow;
import com.qdlc.p2p.dal.dto.BorrowTender;
import com.qdlc.p2p.dal.dto.User;
import com.qdlc.p2p.dal.model.BorrowModel;
import com.qdlc.p2p.dal.model.BorrowTenderModel;
import com.qdlc.p2p.dal.model.RankModel;
import com.qdlc.p2p.dal.model.TenderDynamicModel;
import com.qdlc.p2p.dal.model.interest.InterestCalculator;

public interface BorrowTenderService {

    /**
     * 在投金额
     *
     * @param userId
     * @return
     */
    double investIngAmount(long userId);

    /**
     * 累计投资金额
     *
     * @param userId
     * @return
     */
    double investAmount(long userId);

    /**
     * 我的投资列表
     *
     * @param borrowTenderModel
     * @return
     */
    PageDataList<BorrowTenderModel> list(BorrowTenderModel borrowTenderModel);

    /**
     * 查改用户是否已经投资此借款标
     *
     * @param borrowId
     * @param userId
     * @return
     */
    double hasTenderTotalPerBorrowByUserid(long borrowId, long userId);

    /**
     * 根据borrowId获取tender的列表
     *
     * @param borrowId
     * @return
     */
    PageDataList<BorrowTenderModel> list(long borrowId, int page, int size);

    /**
     * 平台投标业务
     *
     * @param borrow
     * @param model
     * @return
     */
    BorrowTender addTender(Borrow borrow, BorrowModel model);

    /**
     * 首页显示最新借款
     *
     * @return
     */
    List<BorrowTenderModel> getNewTenderList();

    /**
     * 首页投资排行榜
     *
     * @return
     */
    List<RankModel> getRankList(String rank);

    /**
     * 今天投资动态
     *
     * @return
     */
    List<TenderDynamicModel> getTodayAddTenderList();

    /**
     * @param borrowId
     * @return
     */
    List<BorrowTenderModel> getTenderList(long borrowId);

    /**
     * 根据id查询
     *
     * @param tenderId
     * @return
     */
    BorrowTender getTenderById(long tenderId);

    /**
     * 根据时间获取投资用户个数
     *
     * @param date
     */
    int getTenderCountByDate(String date);

    /**
     * 累计投资金额
     *
     * @return
     */
    double tenderAccount();

    /**
     * 投资用户数个数
     */
    int getInvestUserCount();

    /**
     * 累计投资利息
     *
     * @return
     */
    double tenderAllInterest();

    /**
     * 根据model返回BorrowTenderModel列表(不包含重复标)
     *
     * @param model
     * @return
     */
    PageDataList<BorrowTenderModel> getBorrowTenderlist(BorrowTenderModel model);

    /**
     * 根据model返回BorrowTenderModel列表(投资记录)
     *
     * @param model
     * @return
     */
    PageDataList<BorrowTenderModel> getTenderRecordlist(BorrowTenderModel model);

    /**
     * 根据当前月得到分布图
     *
     * @return
     */

    double[] getDistributedByTypeAndDate(int type, String date);

    /**
     * 平台累计借款人
     *
     * @param date
     * @return
     */
    double[] getCumulativeTenderByDate(String date);

    /**
     * 根据投资时间获取投资人基本信息
     *
     * @param date
     * @return
     */
    int[] getTenderInfoByDate(String date);

    /**
     * 根据投资时间获取投资人所在地分布
     *
     * @param date
     * @return
     */
    Object[][] getTenderAreaDistributedByDate(String date);

    /**
     * 判断用户是否允许投资新手标
     *
     * @param user 用户
     * @return
     */
    boolean canTenderForCategory(User user, int category);

    /**
     * @param tenderBilNo
     * @return
     */
    BorrowTender find(String tenderBilNo);

    /**
     * @param borrowTender
     * @param
     */
    void update(BorrowTender borrowTender);

    /**
     * 通过新浪交易订单号查询
     *
     * @param subOrdId
     * @return
     */
    BorrowTender getTenderByBillNo(String subOrdId);

    /**
     * 今日投资金额
     *
     * @return
     */
    double todayTenderAccount();

    /**
     * 交易成功,修改投标记录
     *
     * @param tender     投标
     * @param calculator 利息计算器
     * @return 修改后的投标记录
     * @author Kaiju Zhao
     */
    BorrowTender tenderSuccess(BorrowTender tender, InterestCalculator calculator);

    /**
     * 体验标还款
     *
     * @return
     */
    List<BorrowTenderModel> repaymentExperience();

    /**
     * 体验标还款
     * 更新状态
     *
     * @return
     */
    void repaymentStatus(BorrowTenderModel TenderModel, User user);

    /**
     * 根据borrowId获取tender的列表(app端使用)
     *
     * @param borrowId
     * @return
     */
    PageDataList<BorrowTenderModel> listInvestor(long borrowId, int page, int size);

    /**
     * 根据时间获取投资总数
     * @param date
     */
    double getTenderAmountByDate(String date);

    /**
     * 根据borrowId以及userId 查找总投资及总利息
     */
    BorrowTender getBorrowTenderAmountByBorrowId(long borrowId, long userId);
}
